//反转链表

struct ListNode* reverseBetween(struct ListNode* head, int left, int right){
if(head==NULL)
{
    return false;
}
if(left==right)//不用反转
{
    return head;
}
struct ListNode* Length=head;
int length=0;
    while(Length!=NULL){
        length++;
        Length=Length->next;
    }
 

struct ListNode* tmp=malloc(sizeof(struct ListNode));//head的指向会改变，用tmp->next标记一下
tmp->val=1;
tmp->next=head;
struct ListNode* p=head,* y=head,* x=p->next,* q=y->next;
int i=0,j=0;
while(p!=NULL&&p->next!=NULL&&(i<left-2))//让p对准需要反转的前一个数，x对准left
{
    p=p->next;
    x=p->next;
    i++;
}
if(x->next==NULL)//如果只有两个节点，直接反转
{
    tmp->next=x;
    x->next=p;
    p->next=NULL;

}


else if(right==length)//q会对准right的下一个节点，如果节点为NULL，搞不懂为什么不写这个最后一个节点就反转不过来
{
    if(left==1)//改变首节点的情况
    {
        p=tmp;
        x=head;
    }
     y=x->next;
    while(y!=NULL)//把y提上去
    {
    x->next=y->next;
    y->next=p->next;
    p->next=y;
    y=x->next;
    }
}


else
{
    if(left==1)
    {
        p=tmp;
        x=head;
    }
y=x->next;
if(y->next==NULL)
{
    p->next=y;
    y->next=x;
    x->next=NULL;
}
else
{
    q=y->next;
}
while(q!=NULL&&q->next!=NULL&&(j<right-left-1))
{
    q=q->next;
    j++;
}
while(q!=y&&y!=NULL&&x!=NULL&&x->next!=NULL&&y->next!=NULL)
{
    x->next=y->next;
    y->next=p->next;
    p->next=y;
    y=x->next;
}
}
return tmp->next;
}